home *** CD-ROM | disk | FTP | other *** search
/ Aminet 2 / Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso / Aminet / util / misc / Fudgit233.lha / Source / src / putenv.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-12-14  |  2.2 KB  |  77 lines

  1.  
  2. /*******************************************************************************
  3.  *  The Elm Mail System  -  $Revision: 5.1 $   $State: Exp $
  4.  *
  5.  *            Copyright (c) 1992 USENET Community Trust
  6.  *******************************************************************************
  7.  * Bug reports, patches, comments, suggestions should be sent to:
  8.  *
  9.  *    Syd Weinstein, Elm Coordinator
  10.  *    elm@DSI.COM            dsinc!elm
  11.  *
  12.  *******************************************************************************
  13.  * $Log: putenv.c,v $
  14.  * Revision 5.1  1992/10/03  22:41:36  syd
  15.  * Initial checkin as of 2.4 Release at PL0
  16.  *
  17.  *
  18.  ******************************************************************************/
  19.  
  20. /*
  21.  * This code was stolen from cnews.  Modified to make "newenv" static so
  22.  * that realloc() can be used on subsequent calls to avoid memory leaks.
  23.  *
  24.  * We only need this if Configure said there isn't a putenv() in libc.
  25.  */
  26.  
  27. /* peculiar return values */
  28. #define WORKED 0
  29. #define FAILED 1
  30. #define NO 0
  31. #define YES 1
  32. #ifndef NULL
  33. #define NULL (0)
  34. #endif
  35.  
  36. int putenv(char *var)            /* put var in the environment */
  37. {
  38.     register char **envp;
  39.     register int oldenvcnt;
  40.     static char **newenv = NULL;
  41.     extern char **environ;
  42.  
  43.     /* count variables, look for var */
  44.     for (envp = environ; *envp != 0; envp++) {
  45.         register char *varp = var, *ep = *envp;
  46.         register int namesame;
  47.  
  48.         namesame = NO;
  49.         for (; *varp == *ep && *varp != '\0'; ++ep, ++varp)
  50.             if (*varp == '=')
  51.                 namesame = YES;
  52.         if (*varp == *ep && *ep == '\0')
  53.             return WORKED;    /* old & new var's are the same */
  54.         if (namesame) {
  55.             *envp = var;    /* replace var with new value */
  56.             return WORKED;
  57.         }
  58.     }
  59.     oldenvcnt = envp - environ;
  60.  
  61.     /* allocate new environment with room for one more variable */
  62.     if (newenv == NULL)
  63.         newenv = (char **)malloc((unsigned)((oldenvcnt+1+1)*sizeof(*envp)));
  64.     else
  65.         newenv = (char **)realloc((char *)newenv, (unsigned)((oldenvcnt+1+1)*sizeof(*envp)));
  66.     if (newenv == NULL)
  67.         return FAILED;
  68.  
  69.     /* copy old environment pointers, add var, switch environments */
  70.     (void) bcopy((char *)environ, (char *)newenv, oldenvcnt*sizeof(*envp));
  71.     newenv[oldenvcnt] = var;
  72.     newenv[oldenvcnt+1] = NULL;
  73.     environ = newenv;
  74.     return WORKED;
  75. }
  76.  
  77.